<template>
  <div class="login-container">
    <div class="logo-box" />
    <div class="form-box">
      <!--登录表单-->
      <el-form ref="formRef" :model="loginForm" :rules="loginRules">
        <h3>登录</h3>
        <!-- 账号框 -->
        <el-form-item prop="mobile">
          <el-input v-model="loginForm.mobile" placeholder="请输入手机号">
            <template #prefix>
              <svg-icon icon-class="user" />
            </template>
          </el-input>
        </el-form-item>
        <!-- 密码框 -->
        <el-form-item prop="password">
          <el-input
            v-model="loginForm.password"
            :type="passwordType"
            placeholder="请输入密码"
          >
            <template #prefix>
              <svg-icon icon-class="password" />
            </template>
            <template #suffix>
              <svg-icon
                :icon-class="passwordType === 'password'? 'eye':'eye-open'"
                @click="passwordType = passwordType === 'password'? 'text':'password'"
              />
            </template>
          </el-input>
        </el-form-item>
        <!-- 复选框 -->
        <el-form-item prop="isAgree">
          <el-checkbox v-model="loginForm.isAgree">用户平台使用协议</el-checkbox>
        </el-form-item>
        <!-- 登录按钮 -->
        <el-form-item>
          <el-button type="primary" style="width:100%" @click="handleLogin">登录</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
import { mapActions } from 'vuex'
// 为了调试方式,在开发环境下的登录页表单填入数据.
const isDev = process.env.NODE_ENV === 'development'
// console.log(isDev)

export default {
  name: 'LoginView',
  data() {
    return {
      passwordType: 'password',
      // 表单对象
      loginForm: {
        // 开发环境下的表单值自动填入,其他环境为空字符串
        mobile: isDev ? '13800000002' : '',
        password: isDev ? 'hm#qd@23!' : '',
        isAgree: isDev
      },
      // 校验规则:
      loginRules: {
        mobile: [
          { required: true, message: '请填写手机号', trigger: 'blur' },
          { pattern: /^1[3-9]\d{9}$/, message: '请填写合法的手机号', trigger: 'blur' }
        ],
        password: [
          { required: true, message: '请填写密码', trigger: 'blur' },
          { min: 6, max: 16, message: '请填写6-16位密码', trigger: 'blur' }
        ],
        isAgree: [
          {
            // validator:自定义见校验规则
            // rule: 校验规则
            // value: isAgree的值
            // callback(): 回调函数,通过了不传参数,否则传入错误对象.
            validator: (rulr, value, callback) => {
              value ? callback() : callback(new Error('请同意用户协议'))
            },
            trigger: 'change' // 触发时机
          }
        ]
      }
    }
  },
  methods: {
    // 映射user子模块中的action函数
    ...mapActions('user', ['loginAction']),
    // 展示密码
    showPwd() {
      if (this.passwordType === 'password') {
        this.passwordType = ''
      } else {
        this.passwordType = 'password'
      }
      this.$nextTick(() => {
        this.$refs.password.focus()
      })
    },
    // 确定按钮
    handleLogin() {
      // 点击确定 通过refs拿到表单,调用表单的整体校验方法
      this.$refs.formRef.validate(async flag => {
        if (!flag) return // flag为整体校验的结果,true为全体校验通过,false为不通过
        // console.log('通过校验')
        // 触发action函数 (通过映射触发action函数)
        try {
          // action函数返回值是Promise实例,需要用await 变成同步的
          // tyr-catch可以在action函数定义的时候或是调用的时候都行，但是如果在调用的使用try-catch，必须用await 和async， 因为action函数会返回一个Promise实例
          await this.loginAction(this.loginForm)
          // 成功的提示
          this.$message.success('登录成功')
          // 优先跳转至回跳地址,否则跳转至首页
          this.$router.push(this.$route.query.redirectUrl || '/')
          console.log(this.$route.query.redirectUrl)
        // eslint-disable-next-line no-empty
        } catch (error) {
        }
      })
    }
  }
}
</script>

<style lang="scss" scoped>
  .login-container {
    display: flex;
    min-height: 100vh;
    .logo-box {
      flex: 1;
      min-height: 100vh;
      // 在style中写@需要加~,否则识别不出来,vue/js文件中可以直接使用@.
      background: url('~@/assets/common/login_back.png') no-repeat;
    }
    .form-box {
      display: flex;
      justify-content: center;
      align-items: center;
      width: 500px;
      ::v-deep {
        .el-form {
          flex: 1;
          padding: 0 30px;
          input {
            padding-left: 38px;
          }
          span.el-input__prefix {
            padding: 0 10px;
          }
          span.el-input__suffix {
            padding: 0 10px;
          }
        }
      }
    }
  }
</style>
